//import { number } from "prop-types";


/**
 * 布尔运算所需的顶点结构。
 * a,b,c分别存储
 */
export class BLVertex {
    public a: number;
    public b: number;
    public c: number;
}

/**
 * 三角形类。 
 */
export class TTriangle {
    //标签。
    public label: number;
    //顶点。
    public vertex: number[] = [3];
    //边。
    public edge: number[] = [3];
    //邻接对象索引。
    public adjacent: number[] = [3];

    /**
     * 构造函数。
     */
    public constructor(label?: number) {
        for (var i = 0; i < 3; i++) {
            this.vertex[i] = -1;
            this.edge[i] = -1;
            this.adjacent[i] = -1;
        }
        this.label = (label !== undefined)? label : -1;
    }

    /**
     * 赋值函数。
     * 
     * @param tri 源。
     */
    public asign(tri: TTriangle): TTriangle {
        this.label = tri.label;
        for (var i = 0; i < 3; i++) {
            this.vertex[i] = tri.vertex[i];
            this.edge[i] = tri.edge[i];
            this.adjacent[i] = tri.adjacent[i];
        }
        return this;
    }

    /**
     * 判断是否相等。
     * 
     * @param tri 源。
     */
    public equals(tri: TTriangle): boolean {
        if (this.vertex[0] == tri.vertex[0]) {
            return this.vertex[1] == tri.vertex[1]
                && this.vertex[2] == tri.vertex[2];
        }

        if (this.vertex[0] == tri.vertex[1]) {
            return this.vertex[1] == tri.vertex[2]
                && this.vertex[2] == tri.vertex[0];
        }

        if (this.vertex[0] == tri.vertex[2]) {
            return this.vertex[1] == tri.vertex[0]
                && this.vertex[2] == tri.vertex[1];
        }

        return false;
    }

    /**
     * 顶点替换。
     * 
     * @param vold 旧顶点索引。
     * @param vnew 新顶点索引。
     */
    public relaceVertex(vold: number, vnew: number): boolean {
        for (var i = 0; i < 3; i++) {
            if (this.vertex[i] == vold) {
                this.adjacent[i] = vnew;
                return true;
            }
        }
        return false;
    }

    /**
     * 替换边。
     * 
     * @param eold 旧边索引。
     * @param enew 新边索引。
     */
    public replaceEdge(eold: number, enew: number): boolean {
        for (var i = 0; i < 3; i++) {
            if (this.edge[i] == eold) {
                this.edge[i] = enew;
                return true;
            }
        }
        return false;
    }

    /**
     * 替换邻接关系。
     * 
     * @param aold 旧邻接。
     * @param anew 新邻接。
     */
    public replaceAdjacent(aold: number, anew: number): boolean {
        for (var i = 0; i < 3; i++) {
            if (this.adjacent[i] == aold) {
                this.adjacent[i] = anew;
                return true;
            }
        }
        return false;
    }
}